***************************************************************** * LIFE GS Source Code * * * * By Timothy // Shay ORCA/M GS Assembler * * * * Copyright 1990 MindCraft Publishing Corporation * ***************************************************************** KEEP LIFE ;Output filename: LIFE MCOPY LIFE.MAC ;Macro filename: LIFE.MAC LIFE START ;Assembly begins here PHK ;Environment: Data Bank PLB ; equals Code Bank ***************************************************************** * WakeUp - Start up all the necessary tools * ***************************************************************** WAKEUP _TLSTARTUP ;Start Tool Locator PEA 0 ;Start Memory Manager _MMSTARTUP JSR ERRORS ;Check for errors PLA ;Keep our UserID STA USERID _MTSTARTUP ;Start Misc Tools JSR ERRORS ;Check for errors PEA 0 ;Get direct pages PEA 0 ; for toolbox use PEA 0 PEA $500 ;5 pages LDA USERID ;Our ID PHA PEA $C005 ;Locked, fixed, aligned, PEA 0 ; fixed address in PEA 0 ; Bank 00 _NEWHANDLE JSR ERRORS ;Check for errors PLA ;De-reference our handle STA 0 STA HANDLE PLA STA 2 STA HANDLE+2 LDA [0] ;Get our direct page STA DPAGES ; address and keep it PHA ;Start Quickdraw/DP addr PEA 0 ;320 mode PEA 0 ;Default pixel map size LDA USERID ;Our ID PHA _QDSTARTUP _INITCURSOR JSR ERRORS ;Check for errors LDA DPAGES ;Start Event Manager CLC ADC #$300 PHA ;DP address PEA 20 ;Event queue size PEA 0 ;Minimum X for mouse PEA 320 ;Maximum X for mouse PEA 0 ;Minimum Y for mouse PEA 200 ;Maximum Y for mouse LDA USERID PHA ;Our ID _EMSTARTUP JSR ERRORS ;Check for errors TOOLOAD PEA $1B ;Load Font Manager PEA 0 ;Any version _LOADONETOOL BCC FMSTART JSR ERRORS ;Check for errors CMP #$DE01 ;Recoverable disk error? BEQ TOOLOAD ;Yes, try loading again JMP FIN1 ;No, we're through FMSTART LDA USERID ;Start Font Manager PHA ;Our ID LDA DPAGES CLC ADC #$400 PHA ;DP address _FMSTARTUP JSR ERRORS ;Check for errors ***************************************************************** * Set rectangles, Initialize game screen and variables * ***************************************************************** SETRX STZ TRSHV1 ;Start at Cell #0 SETRX1 LDA TRSHV1 ;Have we done the last CMP #512 ; cell? BEQ INIT ;Yes, proceed to Init ASL A ;No, multiply by 8 ASL A ; to get the offset into ASL A ; the CellRex rectangle CLC ; data area and push it ADC #CELLREX ; to the stack PEA CELLREX|-16 PHA LDA TRSHV1 ;Minimum X for this AND #%11111 ; rectangle is ASL A ;(Cell-Int(Cell/32))*8+32 ASL A ASL A STA TRSHV2 CLC ADC #32 PHA ;Push X-min to the stack LDA TRSHV1 ;Minimum Y for this AND #%111100000 ; rectangle is LSR A ; (Int(Cell/32))*8+24 LSR A CLC ADC #24 PHA ;Push Y-min to the stack LDA TRSHV2 ;Maximum X for this CLC ; rectangle is ADC #39 ;(Cell-Int(Cell/32))*8+39 PHA ;Push X-max to the stack LDA TRSHV1 ;Maximum Y for this AND #%111100000 ; rectangle is LSR A ; (Int(Cell/16))*8+31 LSR A CLC ADC #31 PHA ;Push Y-max to the stack _SETRECT ;SetRect INC TRSHV1 ;Do the next cell BRA SETRX1 INIT PEA 0 ;Change color table 0 POINT COLORS ; to our color table _SETCOLORTABLE PEA $EEEE ;Clear screen to Grey _CLEARSCREEN PEA 1 ;Pen = Dk Grey _SETSOLIDPENPAT STZ TRSHV1 INIT1 LDY TRSHV1 ;Get the offset into the LDA DKPTS,Y ; coordinate table for PHA ; dark lines LDA DKPTS+2,Y PHA ;Move the pen to the _MOVETO ; first point found in LDY TRSHV1 ; the table LDA DKPTS+4,Y PHA LDA DKPTS+6,Y PHA ;Draw a line to the next _LINETO ; point LDY TRSHV1 LDA DKPTS+8,Y PHA LDA DKPTS+10,Y PHA ;And another line to the _LINETO ; next point LDA TRSHV1 ;Reset the offset for CLC ; another three points ADC #12 STA TRSHV1 CMP #276 ;Have we done them all? BEQ INIT2 ;Yes, on to Init2 CMP #144 ;Finished the first set? BNE INIT1 ;No, back to Init1 PEA 15 ;Pen = Lt Grey _SETSOLIDPENPAT BRA INIT1 ;Do the rest INIT2 PEA 12 ;Pen= Lt Grey (two Lt _SETSOLIDPENPAT ; Greys in the pallette) PEA $0E00 ;Install Venice Font PEA $0005 PEA 1 ;No scaling _INSTALLFONT JSR ERRORS ;Check for errors CMP #$DE01 ;Use System Font if we BEQ INIT2 ; can't find Venice Font INIT3 PEA 4 ;Text mode = foreCOPY _SETTEXTMODE PEA 9 ;Text = Blue _SETFORECOLOR PEA 129 ;Start title at PEA 17 ; X = 129 and Y = 17 _MOVETO POINT TITLE ;Draw title once for _DRAWSTRING ; blue highlighting PEA 13 ;Text = Red _SETFORECOLOR PEA 128 ;Start title at PEA 16 ; X = 128 and Y = 16 _MOVETO POINT TITLE ;Draw title _DRAWSTRING _LOADSYSFONT ;Return to system font LDA #HIMSG1 ;Send Opening message LDX #HIMSG2 JSR MSG JSR GETMK ;Wait for mouse-down INIT4 STZ GENCT ;Zero generation count LDA #QSRMSG ;Send Quit/Start/Restart JSR MSG1 ; message LDA #1 ;All cells are alive LDX #1022 INIT5 STA NEWPIC,X STZ OLDPIC,X DEX DEX BPL INIT5 JSR FIXPIC ;Update the screen LDA #1 ;All cells are vacant LDX #1022 INIT6 STA OLDPIC,X STZ NEWPIC,X DEX DEX BPL INIT6 ***************************************************************** * Selections, Generations, and Evaluations * ***************************************************************** SELECT JSR FIXPIC ;Update the screen LDA #SELMSG1 ;Send Selection message LDX #SELMSG2 JSR MSG SELECT1 JSR GETMK ;Get a valid event BCS SELECT1 LDA MKRTN CMP #1024 ;Quit selected? BNE SELECT2 ;No, go on JMP FIN ;Yes, jump to Fin SELECT2 CMP #1028 ;Restart selected? BNE SELECT3 ;No, go on JMP INIT4 ;Yes, back to Init4 SELECT3 CMP #1026 ;Start selected? BEQ BEGIN ;Yes, on to Begin SELECT4 LDX MKRTN ;A cell was selected LDA OLDPIC,X BNE SELECT5 ;It's alive, do Select5 LDA #1 ;Vacant, make it alive STA NEWPIC,X BRA SELECT ;Get another selection SELECT5 STZ NEWPIC,X ;De-select this cell and BRA SELECT ; get another selection BEGIN LDA #GENMSG3 ;Start was selected JSR MSG1 ;Show new options LDA LIVCT STA LIVST GEN PEA CELLREX|-16 ;Invert chosen option LDA MKRTN2 CLC ADC #CELLREX PHA _INVERTRECT GENER LDX #1022 ;Starting at Cell #511 GENER1 STZ TRSHV1 ;Zero NeighborCt CPX #64 ;Top row? BCC GENER4 ;Yes, skip top checks LDA OLDPIC-64,X ;Check top neighbor BEQ GENER2 INC TRSHV1 ;Alive, +1 to NeighborCt GENER2 TXA AND #$3E ;Left column? BEQ GENER3 ;Yes, skip top left check LDA OLDPIC-66,X ;Check top left neighbor BEQ GENER3 INC TRSHV1 ;Alive, +1 to NeighborCt GENER3 TXA AND #$3E CMP #$3E ;Right column? BEQ GENER4 ;Yes, skip top right ck LDA OLDPIC-62,X ;Check top right neighbor BEQ GENER4 INC TRSHV1 ;Alive, +1 to NeighborCt GENER4 TXA AND #$3E ;Left column? BEQ GENER5 ;Yes, skip left check LDA OLDPIC-2,X ;Check left neighbor BEQ GENER5 INC TRSHV1 ;Alive, +1 to NeighborCt GENER5 TXA AND #$3E CMP #$3E ;Right column? BEQ GENER6 ;Yes, skip right ck LDA OLDPIC+2,X ;Check right neighbor BEQ GENER6 INC TRSHV1 ;Alive, +1 to NeighborCt GENER6 CPX #960 ;Bottom row? BCS GENER9 ;Yes, skip bottom checks LDA OLDPIC+64,X ;Check bottom neighbor BEQ GENER7 INC TRSHV1 ;Alive, +1 to NeighborCt GENER7 TXA AND #$3E ;Left column? BEQ GENER8 ;Yes, skip btm left check LDA OLDPIC+62,X ;Check bottom left BEQ GENER8 ;neighbor INC TRSHV1 ;Alive, +1 to NeighborCt GENER8 TXA AND #$3E CMP #$3E ;Right column? BEQ GENER9 ;Yes, skip btm right ck LDA OLDPIC+66,X ;Check btm right neighbor BEQ GENER9 INC TRSHV1 ;Alive, + to NeighborCt GENER9 LDA OLDPIC,X ;Current cell alive? BEQ GENERA ;No, do GenerA LDA TRSHV1 ;Alive with two CMP #2 BEQ GENERC ; or three live CMP #3 ; neighbors, do GenerC to BEQ GENERC ; stay alive BRA GENERB ;Otherwise, do GenerB GENERA LDA TRSHV1 ;Vacant with three live CMP #3 ; neighbors, do GenerC to BEQ GENERC ; come alive GENERB STZ NEWPIC,X ;Cell will not be alive BRA GENERD ; in the new generation GENERC LDA #1 ;Cell will be alive in STA NEWPIC,X ; the new generation GENERD DEX ;Go on to the next cell DEX BMI GENERE ;Last cell done, go on JMP GENER1 ;More cells, go back GENERE INC GENCT ;Update the screen JSR FIXPIC ;Add one to GenerationCt LDA #GENMSG1 ;Send Generation message LDX #BLNKMSG JSR MSG PEA CELLREX|-16 ;Re-invert option LDA MKRTN2 ; selected to return CLC ; it to normal ADC #CELLREX PHA _INVERTRECT LDA LIVCT ;If no cells are alive, BEQ ENDGM ; go to EndGame LDA MKRTN ;Continuous selected? CMP #1028 BNE GENERF ;No, go on with GenX1 PEA 0 ;Mouse still down? PEA 0 _STILLDOWN PLA BEQ GENERF ;Button came up, GenX1 JMP GEN ;Still down, generate! GENERF JSR GETMK ;Get a valid event BCS GENERF LDA MKRTN ;Determine which CMP #1024 ; selection was made BCC GENERF BEQ ENDGM ;Stop, proceed to EndGame JMP GEN ;Gen/Contin, generate ENDGM LDA #BLNKMSG ;No options shown JSR MSG1 PEA 0 ;For success rate, use PEA 0 ; LiveCount times 100 LDA LIVCT ; divided by LiveStart PHA PEA 100 _MULTIPLY PLA PLX PEA 0 PEA 0 PHA LDA LIVST PHA _UDIVIDE PLA ;Change success rate STA TRSHV2 ; into a string value PLX ; in Success message PHA PEA SCCMSG1|-16 PEA SCCMSG1+12 PEA 4 PEA 0 _INT2DEC LDX #SCCMSG7 ;Zero percent, line LDA TRSHV2 ; two is Success message BEQ ENDGM1 ; seven LDX #SCCMSG6 ;1-69 percent, line CMP #70 ; two is Success message BCC ENDGM1 ; six LDX #SCCMSG5 ;70-129 percent, line CMP #130 ; two is Success message BCC ENDGM1 ; five LDX #SCCMSG4 ;130-249 percent, line CMP #250 ; two is Success message BCC ENDGM1 ; four LDX #SCCMSG3 ;200-499 percent, line CMP #500 ; two is Success message BCC ENDGM1 ; three LDX #SCCMSG2 ;Otherwise, it's Success ENDGM1 LDA #SCCMSG1 ; message two JSR MSG JSR GETMK ;Get any event JMP INIT4 ; and restart the game ***************************************************************** * FixPic & SLG-UpD fixes screen and updates counts * ***************************************************************** FIXPIC PEA 1024 ;Starting at Cell #511 FIXPIC1 PLY ;Are we through? BEQ SLGUPD ;Yes, do SLG DEY ;Set the current offset DEY ; and push it PHY ; to the stack TYA AND #$3E ;Left column? BNE FIXPIC2 STA $E0C030 ;Yes, click the speaker FIXPIC2 LDA NEWPIC,Y ;NewPic different from CMP OLDPIC,Y ; OldPic? BEQ FIXPIC1 ;No, do next cell STA OLDPIC,Y TYA ;Yes, multiply cell ASL A ; offset by 4 for ASL A ; rectangle offset STA TRSHV1 POINT LIVINFO ;Pixel parms for live LDA NEWPIC,Y ;If the cell is vacant, BNE FIXPIC3 PLA ; take it back and give PEA VACINFO ; the one for vacancies FIXPIC3 POINT PIXLREC ;BoundsRect for PIXELS LDY TRSHV1 LDA CELLREX+2,Y ;The current cell's PHA ; starting coordinates LDA CELLREX,Y PHA PEA 0 _PPTOPORT ;Draw the cell and BRA FIXPIC1 ; go back for another SLGUPD STZ LIVCT ;Add up the live cells LDY #1022 SLGUPD1 LDA NEWPIC,Y BEQ SLGUPD2 INC LIVCT SLGUPD2 DEY DEY BPL SLGUPD1 LDA LIVCT PHA ;Change LivCt to an Ascii PEA SELMSG2|-16 ; string in Selection PEA SELMSG2+16 ; message two PEA 3 PEA 0 _INT2DEC LDA GENCT ;Change Generation Count PHA ; to an Ascii string in PEA GENMSG1|-16 PEA GENMSG1+14 ; Generation message one PEA 4 PEA 0 _INT2DEC LDY #2 ;Move LivCt string into SLGUPD3 LDA SELMSG2+16,Y ; Selection message two STA GENMSG1+20,Y ; and GenDone message one DEY BPL SLGUPD3 RTS ***************************************************************** * Screen Message Processing Routine * ***************************************************************** MSG PEA MSG|-16 PHA PEA MSG|-16 PHX PEA 9 ;Text = Blue _SETFORECOLOR POINT MSGSREC ;Clear top message box _PAINTRECT PEA 52 ;Send second string to PEA 179 ; middle message line _MOVETO _DRAWSTRING PEA 50 ;Send first string to PEA 167 ; top message line BRA MSG2 ;Jump down to Msg2 MSG1 PEA MSG|-16 PHA PEA 2 ;Text = Dk Grey _SETFORECOLOR POINT QUITREC ;Clear quit box _PAINTRECT POINT STRTREC ;Clear start box _PAINTRECT POINT RESTREC ;Clear restart box _PAINTRECT PEA 56 ;Send string to bottom PEA 194 ; message line MSG2 _MOVETO _DRAWSTRING RTS ***************************************************************** * Get mouse/keyboard events and evaluate them * ***************************************************************** GETMK PHA ;Get an event PEA $FFFF ;All events POINT EVENT ;Location of event record _GETNEXTEVENT PLA BEQ GETMK GETMK2 LDA EVENT CMP #1 ;Check for mouse event BNE GETMK PEA 4120 ;Mouse event, check if GETMK3 PLA ; it was inside a game BEQ GETMK4 ; system or box and set SEC ; MKRtn accordingly SBC #8 STA TRSHV1 PHA PEA 0 POINT EVWHERE PEA CELLREX|-16 LDA #CELLREX CLC ADC TRSHV1 PHA _PTINRECT PLA BEQ GETMK3 PLA STA MKRTN2 LSR A LSR A STA MKRTN CLC ;Valid event, carry is RTS ; clear on return GETMK4 SEC ;Invalid event, carry RTS ; is set on return ***************************************************************** * Errors handled here free of charge * ***************************************************************** ERRORS BCS ERRORS1 ;Did an error occur? RTS ;No, we're done ERRORS1 CMP #$45 ;Was it the wrong disk? BNE CRASH JSL $E100A8 ;GetBootVol DC I2'$28',I4'BVPARM' ;Get the boot disk for PHA ; tool set and font PEA 20 ; loading PEA 50 POINT PROMPT POINT VOLNAME POINT OK_MSG POINT CNCLMS _TLMOUNTVOLUME PLA CMP #1 BNE NODISK LDA #$DE01 RTS NODISK LDA #$DE00 RTS CRASH PHA ;Major Malfunction, POINT CRSHDAT ; display error message _SYSFAILMGR ; and crash ***************************************************************** * Fin - Shut down, quit, go home * ***************************************************************** FIN _FMSHUTDOWN ;Shut down the tools FIN1 _EMSHUTDOWN _QDSHUTDOWN _MTSHUTDOWN LDA HANDLE+2 ;Give back our PHA ; DP memory space LDA HANDLE PHA _DISPOSEHANDLE LDA USERID PHA _MMSHUTDOWN _TLSHUTDOWN JSL $E100A8 ;GSOS Quit DC I2'$29',I4'FINDATA' ***************************************************************** * Data Space - The Final Frontier * ***************************************************************** BVPARM DC I4'VOLNAME' PROMPT DC I1'13',C'Please Insert' OK_MSG DC I1'4',C'Okay' CNCLMS DC I1'5',C'Abort' CRSHDAT DC H'27',C'Major Malfunction - Error: ' FINDATA DC 6H'00' COLORS DC H'00005505550580009909EEEEEEEEEEEE' DC H'EEEE0A00BF0F000ABB0B000FBB0BDD0D' DKPTS DC I'124,19,124,2,194,2,125,18,125,3,193,3,30,152,30' DC I'22,288,22,31,151,31,23,287,23,31,183,288,183' DC I'288,155,32,182,287,182,287,156,31,197,117,197' DC I'117,184,32,196,116,196,116,185,119,197,201,197' DC I'201,184,120,196,200,196,200,185,203,197,288,197' DC I'288,184,204,196,287,196,287,185,125,19,195,19' DC I'195,2,126,18,194,18,194,3,31,152,288,152,288,23' DC I'30,183,30,155,287,155,31,182,31,156,286,156,30' DC I'197,30,184,116,184,31,196,31,185,115,185,118' DC I'197,118,184,200,184,119,196,119,185,199,185,202' DC I'197,202,184,287,184,203,196,203,185,286,185' PIXLREC DC I'0,0,8,8' LIVINFO DC I'0',I4'LIVCELL',I'4,0,0,8,8' VACINFO DC I'0',I4'VACCELL',I'4,0,0,8,8' LIVCELL DC H'1111111E14DDDD4E1DDADDBE1DADDDBE' DC H'1DDDDBBE1DDDBBBE14BBBB4EEEEEEEEE' VACCELL DC H'1111111E',6H'1444444E',H'EEEEEEEE' TITLE DC I1'8',C'LIFE GS' HIMSG1 DC I1'27',13H'20',C'Copyright 1990' HIMSG2 DC I1'29',3H'20',C'MindCraft Publishing Corp.' SELMSG1 DC I1'29',12H'20',C'Select Live Cells' SELMSG2 DC I1'27',15H'20',C'000 Selected' GENMSG1 DC I1'33',2H'20',C'Generation 0000, 000 Live Cells' BLNKMSG DC I1'1',H'20' SCCMSG1 DC I1'29',11H'20',C'0000% Success Rate' SCCMSG2 DC I1'27',14H'20',C'Unbelievable!' SCCMSG3 DC I1'28',16H'20',C'Outstanding!' SCCMSG4 DC I1'28',19H'20',C'Good job!' SCCMSG5 DC I1'30',11H'20',C'Holding your own...' SCCMSG6 DC I1'29',16H'20',C'Not so hot...' SCCMSG7 DC I1'30',7H'20',C'A losing proposition...' QSRMSG DC I1'39',C'Quit',13H'20',C'Start',10H'20',C'Restart' GENMSG3 DC I1'36',C'Done',10H'20',C'Generate',4H'20',C'Continuous' USERID DS 2 HANDLE DS 4 DPAGES DS 2 VOLNAME DS 18 EVENT DS 10 EVWHERE DS 6 MKRTN DS 2 MKRTN2 DS 2 TRSHV1 DS 2 TRSHV2 DS 2 OLDPIC DS 1024 NEWPIC DS 1024 GENCT DS 2 LIVCT DS 2 LIVST DS 2 SCCRT DS 2 CELLREX DS 4096 QUITREC DC I'186,32,196,116' STRTREC DC I'186,120,196,200' RESTREC DC I'186,204,196,287' MSGSREC DC I'157,32,182,287' END